package com.topvision.myviewtest.kotlin.part2

/**
 * @FileName : Study2.kt
 * @Author   : Zero_Tzz
 * @E-mail   : 497847377@qq.com
 * @Data     : 2018-06-13 21:29
 * @Describe : 基础学习2
 */

fun main(args: Array<String>) {
    val list = arrayOf(1, 2, 3, 4)
    useFor1(list)
    useFor2(list)

    useWhile(5)
    useDoWhile(5)

    useBreak(5)
    useContinue(5)

    foo1()
    foo2()
    foo3()
    foo4()
    foo5()
}

// 根据索引for循环
fun useFor1(list: Array<Int>) {
    for (i in list.indices) {
        print(list[i])
    }
}

fun useFor2(list: Array<Int>) {
    for ((index, value) in list.withIndex()) {
        print("index = $index, value = $value")
    }
}

// while控制 常规用法（可以一次都不执行）
fun useWhile(a: Int) {
    var tempA = a
    while (tempA > 10) {
        tempA++
        print("useWhile tempA = $tempA")
    }
}

// do while 至少执行一次
fun useDoWhile(a: Int) {
    var tempA = a
    do {
        tempA++
        print("useDoWhile tempA = $tempA")
    } while (tempA > 10)
}

// break continue 标签 '@'
fun useBreak(a: Int) {
    // 直接跳出外圈循环
    loop@ for (index in 0..a) {
        for (i in 0..5) {
            if (i == 2) {
                break@loop
            }
            print("index = $index , i = $i")
        }
    }
    println()
}

fun useContinue(a: Int) {
    loop@ for (index in 0..a) {
        for (i in 0..5) {
            if (i == 2) {
                continue@loop
            }
            print("index = $index , i = $i")
        }
    }
    println()
}

// return 使用

fun foo1() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return // 非局部直接返回到 foo() 的调用者
        print(it)
    }
    println("over1") // 不会走
}

fun foo2() {
    listOf(1, 2, 3, 4, 5).forEach lit@{
        if (it == 3) return@lit // 局部返回到该 lambda 表达式的调用者，即 forEach 循环
        println(it)
    }
    println("over2") // 会走
}

fun foo3() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach // 默认参数，局部返回到该 lambda 表达式的调用者，即 forEach 循环
        println(it)
    }
    println("over3") // 会走
}

fun foo4() {
    listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
        if (value == 3) return // 局部返回到匿名函数的调用者，即 forEach 循环
        print(value)
    })
    println("over4") // 会走
}

fun foo5() {
    run loop@{
        listOf(1, 2, 3, 4, 5).forEach {
            if (it == 3) return@loop // 从传入 run 的 lambda 表达式非局部返回
            print(it)
        }
    }
    println("over5")
}